package find.the.first.nonrepeating.character;
/**
 * @Time 2019/12/22
 * @author 王光浩
 * @Need 给定一个字符串，找到该字符串中第一个不重复的字符，并将其下标返回，如果不存在则返回-1。（字符串中只包含小写字母）
 * @Thinking 使用整型数组。数组长度为26，数组中存储的是字符的个数，首先遍历字符串获取每一个字符，将字符的Ascll码减去'a'的ascll
 *           码，以此来获取数组的下标，然后根据下标将对应数值加一。然后循环一次数组，获取值为1的数组下标，将下标加上‘a’，然后在
 *           字符串中找出最下下标值。
 *           复杂度分析：时间复杂度O（n）,空间复杂度O（1）
 * @improve 上面的方法中，在第二次循环找出最小下标的时候我们反复使用了字符串的indexOf()方法，这个方法会循环遍历字符串，
 *           做出许多多余的操作，可以将其改为循环遍历字符串，找到第一个字符-‘a’下标所对应的数组元素值为1的字符就是我们需要找的
 *           字符，然后返回其下标即可。
 *           复杂度分析：时间复杂度O（n），执行两次循环；空间复杂度O（1）
 */
public class OtherMethod {
    public int firstUniqChar(String s) {
    	int[] letter=new int[26];  //创建是值为0
    	int len=s.length();
    	//统计每一个字符出现的个数
    	for(int i=0;i<len;i++) {
    		letter[(int)(s.charAt(i)-'a')]+=1;  
    	}
//    	//找出所有出现一次的字符，并从中获取最小下标
//    	int minIndex=len;
//    	for(int i=0;i<26;i++) {
//    		if(letter[i]==1) {
//    			minIndex=Math.min(minIndex,s.indexOf((char)(i+'a')));
//    		}
//    	}
//    	if(minIndex!=len)
//    		return minIndex;
//    	return -1;
    	//改进
    	for(int i=0;i<len;i++) {
    		if(letter[s.charAt(i)-'a']==1)
    			return i;
    	}
    	return -1;
    }
}
